<?php

/**
 * Diese Funktion lädt automatisch die gewüschten Klassen, wenn diese in classes/
 * existieren.
 * 
 * Diese Funktion muss via spl_autoload_register registriert werden
 * 
 * @param string $class_name Name of the class
 * @throws Exception ERR_CLASS_NOT_FOUND
 */
function autoload($class_name) {

	include 'classpath.php';
	
	if (DEBUG_ENABLED)
		$logger = Logger::getInstance();

	$class_name = str_replace('\\', '/', $class_name);
	
	// debug
	$logger->logFile("Searching for class: ". $class_name, LEVEL_DEBUG);
	
	// Alle validen class Verzeichnisse durchsuchen,
	// bis die erste gefunden wurde, die auf den Namen matched
	foreach ($class_path as $value) {
		// Filename bauen
		$filename = $value . $class_name .'.php';
		
		if (file_exists($filename)) {
			// debug
			$logger->logFile("Loading class: ". $filename, LEVEL_DEBUG);
				
				// Die gefundene Klasse laden
				include $filename;
				
				return;
		}
	}
	
	// Error: class not found
	$logger->logFile("Class not found: ". $class_name, LEVEL_ERROR);

	// An dieser Stelle ist klar: Die Klasse gibt es nicht
	throw new Exception(CLASS_NOT_FOUND_EXCEPTION. ': '. $class_name);
}

/**
 * Diese Function soll als Top Level Exception handler
 * definiert werden, um alle Exceptions abzufangen, die nicht 
 * in einem catch gefangen werden.
 * 
 * @param Exception $e
 */
function uncaught_exception_handler($e) {
	Logger::getInstance()->logFile("Uncaught Exception occured:". $e->getMessage(), LEVEL_EXCEPTION);
}

/**
 * Liefert die Benutzer-ID zurück.
 *
 * Diese Funktion liefert die Benutzer-ID des angemeldeten Benutzers zurück.
 * Falls kein Benutzer angemeldet ist liefert diese Funktion den Wert null
 * zurück. 
 * 
 * Diese Funktion öffnet die Session und liest die Benutzer ID aus.
 * Sollte keine Benutzer ID gesetz sein, so st der Benutzer auch nicht angemeldet.
 */
function getUserID() {

	// Wenn keine Benutzer ID gesetzt ist, ...
	if (!isset($_SESSION['userid'])) {
		// ...dann null zurückgeben
		return null;
	}
	
	return $_SESSION['userid'];
}

/**
 * Prüft ob der aktuell eingeloggte User
 * die übergebene url aufrufen darf
 * @param string $url der Name des URL
 */
function hasPermission($url) {
	$userrightDAO = DAOFactory::getInstance('Userright');
	$rightDAO = DAOFactory::getInstance('Right');
	$accessrightDAO = DAOFactory::getInstance('Accessright');
	
	// Als erstes Prüfen, ob das Recht All an der URL hängt
	if ($accessrightDAO->exists(new Accessright($url, $rightDAO->getByName(RIGHT_ALL)->get_id()))) {
		return true;
	}
	
	// Die Userid holen
	if (!$userid = getUserID()) {
		// info
		Logger::getInstance()->logFile("There is no User logged in.", LEVEL_INFO);
		return null;
	}

	// Alle Rechte des Benutzers laden
	if (!$userrights = $userrightDAO->getByUserId($userid)) {
		// error
		Logger::getInstance()->logFile("Error loading userrights for id '". $userid ."' : ". $userrightDAO->get_error(), LEVEL_ERROR);
		return null;
	}
	
	// Für jedes Recht des Benutzers prfen, ob damit die URL aufgerufen werden darf
	foreach($userrights as $right) {
		// Falls der User das Recht admin hat, dann reicht das als Berechtigung
		if ($right->get_rightid() === $rightDAO->getByName(RIGHT_ADMIN)->get_id())
			return true;
			
		if ($accessrightDAO->exists(new Accessright($url, $right->get_rightid()))) {
			return true;
		}
	}
	
	return false;
}

/**
 * Prüft, ob der eingeloggte Benutzer das entsprechende Recht besitzt
 * @param string $rightname
 */
function hasRight($rightname) {
	// Wenn der Benutzer nicht eingeloggt ist, dann false zurückgeben
	if (!$userid = getUserID()) {
		// info
		Logger::getInstance()->logFile("There is no User logged in.", LEVEL_INFO);
		return false;
	}
	
	// Das Recht laden
	if (!$right = DAOFactory::getInstance('Right')->getByName($rightname)) {
		// info
		Logger::getInstance()->logFile("There is no Right with name '". $rightname ."'", LEVEL_INFO);
		return false;
	}
	
	// Das Benutzerrecht laden
	$exists = DAOFactory::getInstance('Userright')->exists(new Userright($userid, $right->get_id()));
	
	return $exists;
}
?>